﻿using Microsoft.EntityFrameworkCore;
using WorkflowCore.Interface;
using WorkflowCore.Services.DefinitionStorage;
using Yuekao.Domain.BaseReposi;
using Yuekao.Domain.Entitys;
using Yuekao.API.Write.CommandHander;

namespace Yuekao.API.Write
{
    public static class WorkflowExtension
    {
        //UseWorkflowDefinitions ：是对IApplicationBuilder进行扩展的，用于加载数据库中的工作流定义
        public static void UseWorkflowDefinitions(this WebApplication app)
        {
            //获取工作流主机
            var workflowHost = app.Services.GetService<IWorkflowHost>();
            //应用程序启动时
            app.Lifetime.ApplicationStarted.Register(() =>
            {
                //开启流程引擎主机
                workflowHost.Start();
                //创建作用域服务提供商
                using var scope = app.Services.CreateScope();
                var serviceProvider = scope.ServiceProvider;
                //获取数据库的服务
                var repository = serviceProvider.GetService<IBaseRepository<WorkflowDefinitionModel>>();
                //获取定义加载器
                var definitionLoader = serviceProvider.GetService<IDefinitionLoader>();
                //获取工作流注册表
                var workflowRegistry = serviceProvider.GetService<IWorkflowRegistry>();
                
                //获取所有工作流定义
                var list = repository.GetAll().ToList();

                foreach (var item in list)
                {
                    // 检查工作流是否已经注册
                    if (!workflowRegistry.IsRegistered(item.DefinitionId, item.Version))
                    {
                        // 使用DefinitionAddCommandHandler中的逻辑来加载工作流定义
                        var handler = new DefinitionAddCommandHandler(repository, definitionLoader, workflowRegistry);
                        handler.Location(item);
                    }
                }
            });
            //应用程序结束时
            app.Lifetime.ApplicationStopping.Register(() =>
            {
                //停止流程引擎主机
                workflowHost.Stop();
            });
        }
    }
}
